// #include <assert.h>
// #include <ctype.h>
// #include <locale.h>
// #include <errno.h>
// #include <float.h>
// #include <limits.h>
// #include <math.h>
// #include <setjmp.h>
// #include <signal.h>
// #include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// #include <time.h>

void errno_perror_strerror(void)
{
    printf("***** errno_perror_strerror *****\n");
    FILE * pf;
    int errnum;
    pf = fopen ("unexist.txt", "rb");

    if (pf == NULL)
    {
        errnum = errno;
        fprintf(stderr, "error num: %d\n", errno);
        perror("via perror output error");
        fprintf(stderr, "open file error: %s\n", strerror( errnum ));
    }
    else
    {
        fprintf(stderr, "-- error num: %d\n", errno);
        fclose (pf);
    }
}


void divisor_0_error(void)
{
    printf("***** divisor_0_error *****\n");
    int dividend = 20;
    int divisor = 0;
    int quotient;
    
    if( divisor == 0){
        fprintf(stderr, "divisor is 0 exit running...\n");
        printf("EXIT_FAILURE: %d\n", EXIT_FAILURE);
        system("pause");
        // exit(-1);
        exit(EXIT_FAILURE);
    }
    quotient = dividend / divisor;
    fprintf(stderr, "quotient value : %d\n", quotient );
    
    // exit(0);
    exit(EXIT_SUCCESS);
}


void main(void)
{
    errno_perror_strerror();
    divisor_0_error();
    system("pause");
}


/*
在发生错误时，大多数的 C 或 UNIX 函数调用返回 1 或 NULL，
同时会设置一个错误代码 errno，该错误代码是全局变量，表示在函数调用期间发生了错误

C 程序员可以通过检查返回值，然后根据返回值决定采取哪种适当的动作。
开发人员应该在程序初始化时，把 errno 设置为 0，这是一种良好的编程习惯。
0 值表示程序中没有错误。
*/